package _99练习;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

<<<<<<< HEAD
/**
 * @author ZhiCheng Qian
 * @since 2021/11/30 20:10
 */
=======

>>>>>>> 1c69d32fc055e0010098b09f71795769d9a12acd
public class BreakingCode {
    // 生成随机字符串
    static String strA = generateCode();

    // 9.
    //   9.1 产生一个4位随机字符串strA(大写疑问字母数字) 作为一个密码
    //    创建一个破解线程，不断随机产生破解密码，打印显示，与strA比较，如果匹配时终止。
    //    主线程 开启破解线程，等待破解线程结束，打印输出破解出来的密码

    //   9.2 把破解过程中产生的尝试密码，写入到一个文件中

    //  *9.3 编写一个GUI界面程序 显示破解过程

    //  *9.4  开启多个 破解线程，同时破解密码。
    //      只要其中一个破解出来,主程序打印破解出来的密码，程序结束

    public static void main(String[] args) {

        Thread t = new Thread(new breakCode(), "黑客");

        t.setDaemon(true);
        t.start();

        while (true) {
            if (!t.isAlive()) {
                break;
            }
        }
    }

    public static String generateCode() {

        Random r = new Random();

        StringBuilder verificationNum = new StringBuilder();
        // 生成四位
        for (int i = 1; i < 5; i++) {
            // 随机生成数字或者字母
            int randomCharNum = r.nextInt(2);
            if (randomCharNum == 0) {
                // 生成数字
                int num = r.nextInt(9);
                verificationNum.append(num);
            } else {
                // 生成字母
                // 随机生成大写或者小写
                int randomUpDown = r.nextInt(2);
                if (randomUpDown == 0) {
                    // 大写
                    char upNum = (char) (int) (Math.random() * (90 - 65 + 1) + 65);
                    verificationNum.append(upNum);
                } else {
                    // 小写
                    char downNum = (char) (int) (Math.random() * (122 - 97 + 1) + 97);
                    verificationNum.append(downNum);
                }
            }
        }
        return verificationNum + "";
    }
}

class breakCode extends Thread {
    static String breakCode;
    static FileWriter fw;
    static BufferedWriter bw;
    static String path = "D:\\PassWord.txt";
    static ArrayList<String> arrayList = new ArrayList<>();
    

    @Override
    public void run() {
        while (true) {
            breakCode = generateCode();
            if ((BreakingCode.strA).equals(breakCode)) {
                System.out.println("密码为：" + BreakingCode.strA);
                System.out.println("破解成功，破解出来的密码为：" + breakCode);
                break;
            } else {
                arrayList.add(breakCode);
            }
        }


        // 程序结束后将集合容器中的内容写入文件中
        try {
            bw = new BufferedWriter(new FileWriter(path));
            bw.write(String.valueOf(arrayList));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

//        for (String s : arrayList) {
//            System.out.println(s);
//        }
    }


    public static String generateCode() {

        Random r = new Random();

        StringBuilder verificationNum = new StringBuilder();
        // 生成四位
        for (int i = 1; i < 5; i++) {
            // 随机生成数字或者字母
            int randomCharNum = r.nextInt(2);
            if (randomCharNum == 0) {
                // 生成数字
                int num = r.nextInt(9);
                verificationNum.append(num);
            } else {
                // 生成字母
                // 随机生成大写或者小写
                int randomUpDown = r.nextInt(2);
                if (randomUpDown == 0) {
                    // 大写
                    char upNum = (char) (int) (Math.random() * (90 - 65 + 1) + 65);
                    verificationNum.append(upNum);
                } else {
                    // 小写
                    char downNum = (char) (int) (Math.random() * (122 - 97 + 1) + 97);
                    verificationNum.append(downNum);
                }
            }
        }
        return verificationNum + "";
    }
}
